package com.swedne.test.reference;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

public class Reference {

    /**
     * 利用这个特性，我们就可以检测Activity 的内存泄漏，众所周知，Activity在onDestroy()之后被销毁，
     * 那么我们如果利用弱引用来指向Activity，并为它指定一个引用队列，
     * 然后在onDestroy()之后，去查看引用队列里是否有该Activity对应的弱引用，就能确定该Activity是否被回收了。
     *
     * 那么，怎么在onDestroy()之后呢，用Application的registerActivityLifecycleCallbacks()这个api，
     * 就可以检测所有Activity 的生命周期，然后在onActivityDestroyed(activity)这个方法里去检测此activity对应的弱引用是否被放入引用队列，
     * 如果被放入，说明此activity已经被回收了，否则说明此activity发生了泄漏，此时就可以将相关信息打印出来。
     *
     * 但是，这里有一点要注意，activity 的onDestroy()被调用了，只是说明该activity被销毁了，并不是说已经发生了gc，
     * 所以，必要的时候，我们需要手动调用下gc，来保证我们的内存泄漏检测逻辑一定是执行在gc之后，这样才能防止误报。
     *
     */
    static ReferenceQueue<Object> queues = new ReferenceQueue<>();

    public static void main(String[] args) {
        Object object = new Object();
        //object 被回收后会queues队列中会有
        WeakReference weakReference = new WeakReference(object, queues);
        System.out.println("this weakReference is ： " + weakReference);
        System.gc();
        printlnQueue("before");
        object = null;
        System.gc();
        printlnQueue("after");
    }

    private static void printlnQueue(String tag) {
        System.out.print(tag);
        Object obj;
        // 循环打印引用队列
        while ((obj = queues.poll()) != null) {
            System.out.println(": " + obj);
        }
        System.out.println();
    }
}
